// 知识点1：函数模版可以被另一个模版或者普通非模版函数重载：相同名字函数，具有不同数量或者类型的参数
// 知识点2：若模版被重载，则函数的匹配会发生变化：

// 1：匹配过程中，候选函数包括所有的模版实参推断成功的模版实例

// 2：可行函数按类型转换来排序，需要类型转换的排在不需要转换的后面

// 3：若有多个函数提供同样的匹配：若是非模版函数，选择非模版函数。若没有非模版函数，则那个模版的特例高，选哪个，否则的话，此调用会产生歧义

// 知识点3：若多个模版皆为精确匹配，正常情况下无法区分，但是更特例化的的模版排在前面，比如const
// T&和T*p，T *p更加特例化

// 知识点4：C风格字符串指针和字符串字面常量需要进行转换，在定义任何函数之前，记得声明所有重载的函数版本，这样就防止编译器实例化非我们想要的版本
#ifndef DEBUG_REP_H
#define DEBUG_REP_H
#include <iostream>
#include <string>
using namespace std;
template <typename T>
string Debug_rep(const T &t) {
  cout << "const T&：" << t << endl;
  return t.str();
}

template <typename T>
string Debug_rep(T *t) {
  cout << "T *t：" << t << endl;
  return t.str();
}

template <typename T>
string Debug_rep(T t) {
  cout << "T t：" << t << endl;
  return t.str();
}

string Debug_rep(const string &t) {
  cout << "普通版本函数:" << t << endl;
  return t.str();
}

string Debug_rep(char *t) {
  cout << "普通版本函数(接受char*):" << t << endl;
  return Debug_rep(string(t));
}
#endif  // DEBUG_REP_H